TypeScript 中 Interface 和 Type 的差別有以下幾點:
這題在面某知名電腦大廠有被問過
宣告 Type
時,所使用的名稱代表的是其背後的型別結構
type Person = {
name: string;
age: number;
gender: string;
};
type Employee = Person;
/**
* TypeScript 編譯器推論結果為:
* type Employee =
* {
* name: string;
* age: number;
* gender: string;
* }
**/
Interface 介面宣告時會使用名稱代表 TypeScript 編譯器推論的結果
interface Person {
name: string;
age: number;
gender: string;
}
type Employee = Person; // TypeScript 編譯器推論結果為: type Employee = Person
Type 較適合靜態、變動性較小的資料結構,並且可以表達任一型別。
type Phone = {
brand: string;
model: string;
price: number;
};
雖然 Type 無法擴充,但可以使用交集運算子 &
來合併多個 Type。
然而,與 Interface 不同的是,Type 不能進行重新開放(declaration merging),這意味著無法多次聲明一個 Type 來合併屬性。
type Person = {
name: string;
};
type Employee = Person & {
salary: number;
};
另外,Type 不僅限於物件也可以用於其他型別的別名,像是聯合型別、函數型別、原始型別等。
// 原始型別別名
type StringAlias = string;
// 聯合型別
type UnionType = string | number;
// 函數型別
type FunctionType = (a: number, b: number) => number;
Interface 的宣告較為靈活,可以用來描述物件、函式、類別、JSON物件等...,並且可以自由的進行擴充。
interface Person {
name: string;
}
interface Person {
age: number;
}
// 合併後的 Person 會包含 name 和 age 屬性
const person: Person = {
name: "John",
age: 30,
};
Interface 支持宣告合併(declaration merging),這表示可以多次宣告同一個 Interface,並且 TypeScript 會將它們合併。
interface Phone {
brand: string;
model: string;
price: number;
}
interface SmartPhone extends Phone {
os: string;
}
終於完成了第二次的鐵人賽,真的很不容易,雖然這次寫的內容沒有上次豐富,就單純前端面試的八股文而已,但這次沒什麼備稿,幾乎是下班回家從頭開始寫,壓線才提交文章,超累~不過至少有好好地複習了 Javascript 和一些前端的知識點,也希望對剛好有看到這系列文章的讀者有所幫助。